package com.atguigu.redis7.service;

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;

/**
 * @版本： V5.1.0
 * @版权： Copyright @ 2025 广东广昱信息科技有限公司版权所有
 * @作者： 广东广昱信息科技有限公司
 * @日期： 2025-07-13 19:41
 */
@Service
@Slf4j
public class GuavaBloomFilterService {

    //1.定义一个常量
    public static final int _1W = 10000;
    //2.定义我们guava布隆过滤器,初始容量
    public static final int SIZE = 100 * _1W;
    //3.误判率，它越小误判的个数也就越少(思考，是否可以是无限小？？没有误判岂不是更好)
    public static double fpp = 0.03;
    //4.创建guava布隆过滤器
    private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), SIZE, fpp);

    public void guavaBloomFilter(){
        //1.先让bloomFilter加入100W白名单数据
        for (int i = 0; i < _1W; i++) {
            bloomFilter.put(i);
        }
        //2.故意取10W个不合法泛微内的数据，来进行误判率的演示
        ArrayList<Object> list = new ArrayList<>(10 * _1W);
        //3.验证
        for(int i = SIZE+1; i < SIZE + (10 * _1W); i++){
            if(bloomFilter.mightContain(i) ){
                log.info("被误判:{}",i);
                list.add(i);
            }

        }
        log.info("误判数量:{}",list.size());

    }
}
